package com.moyun.common.event.dict.concretehandler.dictitem;

import cn.hutool.cache.Cache;
import cn.hutool.core.collection.ListUtil;
import com.moyun.model.vo.system.DictItemOptions;
import com.moyun.model.vo.system.DictTypeOptions;


import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 功能描述: 字典表加载
 * 数据库中的字典表加载
 * <br/>
 */
public abstract class AbstractDictItemHandler implements IDictItemHandler {

    /** 定义分页每页大小 */
    protected static final int PAGE_SIZE = 50;

    @Override
    public void initDictCache(Collection<DictTypeOptions> dictTypeList, Cache<String, List<DictItemOptions>> cacheData) {
        // 1. 调用子类实现的 getDictTypeList() 方法
        Set<DictTypeOptions> dictTypeOptionsSet = getDictTypeList();
        // 往上层数据去返
        dictTypeList.addAll(dictTypeOptionsSet);
        // 将 DictTypeOptions 对象中的 typeCode 属性映射出来
        List<String> typeCodeList = dictTypeOptionsSet.stream().map(DictTypeOptions::getTypeCode).collect(Collectors.toList());
        int total = typeCodeList.size() / PAGE_SIZE + 1;
        // 分页加载字典数据
        for(int i = 0; i < total; i++) {
            // 2. 调用子类实现的 getDictItemOptions() 方法
            List<DictItemOptions> dictItemList = getDictItemOptions(ListUtil.page(i, PAGE_SIZE, typeCodeList));
            for(DictItemOptions dictItemOptions : dictItemList) {
                // 判断系统缓存中 是否存在 当前字典项 dictItemOptions 所属的字典类型 typeCode 数据
                // 即缓存中 key(typeCode) 是否存在
                if(cacheData.get(dictItemOptions.getTypeCode()) == null) {
                    cacheData.put(dictItemOptions.getTypeCode(), ListUtil.list(false));
                }
                cacheData.get(dictItemOptions.getTypeCode()).add(dictItemOptions);
            }
        }
    }

}
